topic "БЛИЦ и прекомпилированные заголовочники";
[l288;i1120;a17;O9;~~~.1408;2 $$1,0#10431211400427159095818037425705:param]
[a83;*R6 $$2,5#31310162474203024125188417583966:caption]
[H4;b83;*4 $$3,5#07864147445237544204411237157677:title]
[i288;O9;C2 $$4,6#40027414424643823182269349404212:item]
[b42;a42;ph2 $$5,5#45413000475342174754091244180557:text]
[l288;b17;a17;2 $$6,6#27521748481378242620020725143825:desc]
[l321;C@5;1 $$7,7#20902679421464641399138805415013:code]
[b2503;2 $$8,0#65142375456100023862071332075487:separator]
[*@(0.0.255)2 $$9,0#83433469410354161042741608181528:base]
[C2 $$10,0#37138531426314131251341829483380:class]
[l288;a17;*1 $$11,11#70004532496200323422659154056402:requirement]
[i417;b42;a42;O9;~~~.416;2 $$12,12#10566046415157235020018451313112:tparam]
[b167;C2 $$13,13#92430459443460461911108080531343:item1]
[i288;a42;O9;C2 $$14,14#77422149456609303542238260500223:item2]
[*@2$(0.128.128)2 $$15,15#34511555403152284025741354420178:NewsDate]
[l321;*C$7;2 $$16,16#03451589433145915344929335295360:result]
[l321;b83;a83;*C$7;2 $$17,17#07531550463529505371228428965313:result`-line]
[l160;*C+117 $$18,5#88603949442205825958800053222425:package`-title]
[2 $$19,0#53580023442335529039900623488521:gap]
[C2 $$20,20#70211524482531209251820423858195:class`-nested]
[b50;2 $$21,21#03324558446220344731010354752573:Par]
[2 $$0,0#00000000000000000000000000000000:Default]
[{_}%RU-RU 
[s2; [@3 БЛИЦ и прекомпилированные заголовочники]&]
[s3; [@3 Содержание]&]
[s0; &]
[s3; [^topic`:`/`/DinrusIDE`/app`/Blitz`_ru`-ru`#1^ 1. БЛИЦ]&]
[s3; [^topic`:`/`/DinrusIDE`/app`/Blitz`_ru`-ru`#2^ 2. Прекомпилированн
ые заголовочники]&]
[s0; &]
[s3;:1: [@(128.0.255) 1. БЛИЦ]&]
[s5; Блиц `- это продвинутая техника компиляции, 
основанная на подходе [^http`:`/`/en`.wikipedia`.org`/wiki`/Single`_Compilation`_Unit^ S
CU], нацеленном на ускорение перестроения 
больших приложений в режиме отладки. 
Фактически, БЛИЦ позволяет U`+`+ хранить 
библиотеки в форме исходников. Можно 
рассматривать БЛИЦ как автоматизированную 
форму SCU.&]
[s5; Блиц обрабатывает пакеты (не всю 
программу) `- у каждого пакета может 
иметься единичный [/ блиц`-block] (блиц`-блок 
`- это SCU).&]
[s5; Только.cpp, включая файлы с гардами 
включений `- inclusion guards (#ifndef NAME`_H #define 
NAME`_H .... #endif), могут квалифицироваться 
как часть [/ блиц`-блока]. &]
[s5; Альтернативно можно вызвать включение 
с помощью&]
[s7; &]
[s7; #pragma BLITZ`_APPROVE&]
[s7; &]
[s5; или&]
[s7; &]
[s7; //#BLITZ`_APPROVE&]
[s7; &]
[s0; &]
[s5; (также работает и для заголовочников) 
или исключение с помощью&]
[s0; &]
[s7; #pragma BLITZ`_PROHIBIT&]
[s7; &]
[s5; или&]
[s7; &]
[s7; //#BLITZ`_PROHIBIT&]
[s7; &]
[s5; В добавок только файлы, не старее 
одного часа, подходят для [/ блиц`-блока]. 
Эта простая эвристика исключает файл, 
над которым ведётся работа, `- иначе 
изменение в нём потребует перестроения 
всего пакета, что потенциально является 
очень медленным процессом.&]
[s5; Файлы в пакете, которые не рассматриваются 
как [/ блиц`-блоки, ]строятся обычным 
образом.&]
[s5; Можно отключить блиц для отдельных 
пакетов, либо на основе проекта (в 
Органайзере пакетов), либо в диалоговом 
окне Режима вывода (машино`-специфичная 
настройка).&]
[s5; Файлы в [/ блиц`-блоке] сканируются 
на наличие любых #define, они разопределяются. 
Фактически, [/ блиц`-блок] `- это генерируемый 
в папке вывода файл, в который включены 
все одобренные под блиц файлы, и который 
компилируется вместо них (он называется 
`$blitz.cpp, можете посмотреть в вашей 
директории вывода и уточнить детали).&]
[s5; В БЛИЦ также входит один грязный 
трюк, который базово разрешает БЛИЦ`-компиля
цию пакетов, в которых определены 
имена статических переменных, основанных 
на номере строки (макросе `_`_LINE`_`_). 
Статические переменные не имеют видимости 
вне блока компиляции, когда используется 
обычный процесс построения, но при 
применении БЛИЦа, более одного файла 
.cpp компилируется в единый блок, поэтому 
есть вероятность, что пара таких переменных 
будет иметь одинаковые имена.&]
[s5; Следовательно, БЛИЦ добавляет макрос 
BLITZ`_INDEX`_`_, который содержит уникальный 
номер (индекс файла) для каждого файла 
.cpp. Таким образом, можно создать `"статически
е`" идентификаторы, например, типа 
этого (а также скомпилировать их без 
БЛИЦ):&]
[s0; &]
[ {{10000@(255.255.192) [s7; #define MK`_`_s`_`_(x)       s`_`_s##x&]
[s7; #define MK`_`_s`_(x)        MK`_`_s`_`_(x)&]
[s7; &]
[s7; #ifdef  BLITZ`_INDEX`_`_&]
[s7; #define STATIC`_ID            MK`_`_s`_(COMBINE(BLITZ`_INDEX`_`_, 
`_`_LINE`_`_))&]
[s7; #else&]
[s7; #define STATIC`_ID            MK`_`_s`_(`_`_LINE`_`_)&]
[s0;l320; [C@5;1 #endif]]}}&]
[s0; &]
[s3;:2: [@(128.0.255) 2. Прекомпилированные заголовочники
]&]
[s5; [^http`:`/`/en`.wikipedia`.org`/wiki`/Precompiled`_header^ Precompiled 
headers] `- это техника компилятора, пытающаяся 
решить весьма похожую проблему. В 
общем, мы находим, что БЛИЦ быстрее, 
чем использование каких`-то там предкомпилир
ованных заголовочников. Однако, БЛИЦ 
склонен к одному недостатку: комбинируя 
все файлы в один файл объекта, компоновщик 
имеет мало возможности убрать неиспользуемы
й код. Это приводит (иногда очень значительно
) к выпуску исполнимых бинарников 
большего размера. По этой причине 
не рекомендуется (и по умолчанию он 
отключен) БЛИЦ для релизных построений, 
и, по возможности, для них у нас используются
 прекомпилированные заголовочники.&]
[s5; С прекомпилированными заголовочниками 
связан ряд присущих им проблем. Замечено, 
что прекомпилированные заголовочники 
Microsoft C`+`+ трудно использовать с несколькими 
процессами, строя код (Hydra) в отладочном 
режиме. Также, прекомпилированные 
заголовочники, как правило, очень 
толстенные файлы, легко превосходящие 
100 МБ, что создаёт проблему, когда 
нам на каждый пакет нужен такой ПЗ...&]
[s5; По этой причине поддержка ПЗ работает 
так:&]
[s5;l128;i150;O0; ПЗ активируются только в релизном 
выпуске без блиц.&]
[s5;l128;i150;O0; Нужно установить флаг `"Прекомпилиро
ванный заголовочник`" в файлах`-кандидатах 
на прекомпиляцию. Допускается только 
один кандидат на пакет. Заметьте, 
что не все заголовочники могут быть 
в этой системе. Заголовок должен 
иметь гарды включений, и должна иметься 
возможность для всех файлов пакета 
включать его первым, перед остальными 
заголовочниками.&]
[s5;l128;i150;O0; Должен быть установлен метод 
построения `"Разрешить прекомпилированные 
заголовочники`".&]
[s5;l128;i150;O0; Когда пакет строится, вначале 
проверяется, возможно ли использование 
прекомпилированного заголовочника 
(по выше изложенным правилам). Затем 
проверяется, сколько файлов нужно 
перестроить. Если нужно строить 3 
или более файла, U`+`+ прекомпилирует 
этот заголовочник и использует при 
построении пакета. Когда пакет построен, 
U`+`+ удаляет этот заголовочник, чтобы 
сохранить пространство.&]
[s5; U`+`+ поддерживает прекомпилированные 
заголовочники для MSC, GCC и CLANG. Однако, 
практические бенчмарки показывают, 
что в случае с CLANG использование ПЗ 
приводит к ухудшению сроков компиляции.&]
[s0; ]]